Telegram Group & Telegram Channel
🐍 Задача на внимательность и понимание области видимости в Python: «Почему список не заполняется?»

🎯 Цель: Найти, почему переменная ведёт себя не так, как ожидается

📍 Ситуация:

У тебя есть простой код, который должен собирать данные в список из файла:


results = []

def process_file(path):
for line in open(path):
if "error" in line:
results.append(line.strip())

# где-то в другом месте:
process_file("logs1.txt")
process_file("logs2.txt")

print(f"Total errors: {len(results)}")


Но после запуска ты получаешь:

Total errors: 0


🙃 Хотя ты уверен, что в обоих файлах есть строки с "error".

🧩 Задача:

1. Почему список results остаётся пустым?
2. Почему нет ошибки при обращении к results.append(...)?
3. Что будет, если вместо append() просто написать results = [...] внутри функции?
4. Как правильно модифицировать глобальную переменную?
5. Как сделать поведение явным и безопасным?

🛠 Решение:

🔸 Проблема в области видимости переменных:
Функция использует results, определённый вне функции, но не объявляет его как global.
Однако results.append(...) — это допустимая операция, так как она не переназначает переменную, а вызывает метод объекта.

Если бы внутри функции была строка results = [...], Python бы создал локальную переменную results, и тогда append бы вызывал UnboundLocalError.

🔸 Для ясности и чистоты кода лучше делать так:


def process_file(path, results):
for line in open(path):
if "error" in line:
results.append(line.strip())

results = []
process_file("logs1.txt", results)
process_file("logs2.txt", results)


Или, если обязательно нужно использовать глобальную переменную:


results = []

def process_file(path):
global results
for line in open(path):
if "error" in line:
results.append(line.strip())


🔸 Проверка:

- print(locals()) — покажет локальные переменные
- print(globals()) — покажет глобальные

📌 Вывод:
В Python изменение содержимого изменяемой глобальной переменной внутри функции возможно без global, но присваивание новой переменной требует явного global. Это тонкое поведение, которое часто приводит к ошибкам, особенно при работе со списками и словарями.



tg-me.com/python_job_interview/1123
Create:
Last Update:

🐍 Задача на внимательность и понимание области видимости в Python: «Почему список не заполняется?»

🎯 Цель: Найти, почему переменная ведёт себя не так, как ожидается

📍 Ситуация:

У тебя есть простой код, который должен собирать данные в список из файла:


results = []

def process_file(path):
for line in open(path):
if "error" in line:
results.append(line.strip())

# где-то в другом месте:
process_file("logs1.txt")
process_file("logs2.txt")

print(f"Total errors: {len(results)}")


Но после запуска ты получаешь:

Total errors: 0


🙃 Хотя ты уверен, что в обоих файлах есть строки с "error".

🧩 Задача:

1. Почему список results остаётся пустым?
2. Почему нет ошибки при обращении к results.append(...)?
3. Что будет, если вместо append() просто написать results = [...] внутри функции?
4. Как правильно модифицировать глобальную переменную?
5. Как сделать поведение явным и безопасным?

🛠 Решение:

🔸 Проблема в области видимости переменных:
Функция использует results, определённый вне функции, но не объявляет его как global.
Однако results.append(...) — это допустимая операция, так как она не переназначает переменную, а вызывает метод объекта.

Если бы внутри функции была строка results = [...], Python бы создал локальную переменную results, и тогда append бы вызывал UnboundLocalError.

🔸 Для ясности и чистоты кода лучше делать так:


def process_file(path, results):
for line in open(path):
if "error" in line:
results.append(line.strip())

results = []
process_file("logs1.txt", results)
process_file("logs2.txt", results)


Или, если обязательно нужно использовать глобальную переменную:


results = []

def process_file(path):
global results
for line in open(path):
if "error" in line:
results.append(line.strip())


🔸 Проверка:

- print(locals()) — покажет локальные переменные
- print(globals()) — покажет глобальные

📌 Вывод:
В Python изменение содержимого изменяемой глобальной переменной внутри функции возможно без global, но присваивание новой переменной требует явного global. Это тонкое поведение, которое часто приводит к ошибкам, особенно при работе со списками и словарями.

BY Python вопросы с собеседований


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/python_job_interview/1123

View MORE
Open in Telegram


Python вопросы с собеседований Telegram | DID YOU KNOW?

Date: |

NEWS: Telegram supports Facetime video calls NOW!

Secure video calling is in high demand. As an alternative to Zoom, many people are using end-to-end encrypted apps such as WhatsApp, FaceTime or Signal to speak to friends and family face-to-face since coronavirus lockdowns started to take place across the world. There’s another option—secure communications app Telegram just added video calling to its feature set, available on both iOS and Android. The new feature is also super secure—like Signal and WhatsApp and unlike Zoom (yet), video calls will be end-to-end encrypted.

However, analysts are positive on the stock now. “We have seen a huge downside movement in the stock due to the central electricity regulatory commission’s (CERC) order that seems to be negative from 2014-15 onwards but we cannot take a linear negative view on the stock and further downside movement on the stock is unlikely. Currently stock is underpriced. Investors can bet on it for a longer horizon," said Vivek Gupta, director research at CapitalVia Global Research.

Python вопросы с собеседований from es


Telegram Python вопросы с собеседований
FROM USA